{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 和大熊猫们(Pandas)一起游戏吧！"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pandas是Python的一个用于数据分析的库： http://pandas.pydata.org\n",
    "\n",
    "API速查：http://pandas.pydata.org/pandas-docs/stable/api.html\n",
    "\n",
    "基于NumPy,SciPy的功能，在其上补充了大量的数据操作（Data Manipulation）功能。\n",
    "\n",
    "统计、分组、排序、透视表自由转换，如果你已经很熟悉结构化数据库（RDBMS）与Excel的功能，就会知道Pandas有过之而无不及！"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 0. 上手玩：Why Pandas?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "普通的程序员看到一份数据会怎么做？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import codecs\n",
    "import requests\n",
    "import numpy as np\n",
    "import scipy as sp\n",
    "import scipy.stats as spstat\n",
    "import pandas as pd\n",
    "import datetime\n",
    "import json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "r = requests.get(\"http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data\")\n",
    "with codecs.open('S1EP3_Iris.txt','w',encoding='utf-8') as f:\n",
    "    f.write(r.text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5.1,3.5,1.4,0.2,Iris-setosa\n",
      "4.9,3.0,1.4,0.2,Iris-setosa\n",
      "4.7,3.2,1.3,0.2,Iris-setosa\n",
      "4.6,3.1,1.5,0.2,Iris-setosa\n",
      "5.0,3.6,1.4,0.2,Iris-setosa\n",
      "5.4,3.9,1.7,0.4,Iris-setosa\n",
      "4.6,3.4,1.4,0.3,Iris-setosa\n",
      "5.0,3.4,1.5,0.2,Iris-setosa\n",
      "4.4,2.9,1.4,0.2,Iris-setosa\n",
      "4.9,3.1,1.5,0.1,Iris-setosa\n",
      "5.4,3.7,1.5,0.2,Iris-setosa\n"
     ]
    }
   ],
   "source": [
    "with codecs.open('S1EP3_Iris.txt','r',encoding='utf-8') as f:\n",
    "    lines = f.readlines()\n",
    "\n",
    "for idx,line in enumerate(lines):\n",
    "    print line,\n",
    "    if idx==10:\n",
    "        break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pandas的意义就在于\n",
    "\n",
    "### 快速的识别结构化数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.9</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.3</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>4.4</td>\n",
       "      <td>2.9</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.1</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.7</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>4.8</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>4.8</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.1</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>4.3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>5.8</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.2</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>5.7</td>\n",
       "      <td>4.4</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.9</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.3</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>5.7</td>\n",
       "      <td>3.8</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.3</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.8</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.7</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.3</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.5</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>4.8</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.9</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>5.2</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>5.2</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>120</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.2</td>\n",
       "      <td>5.7</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>121</th>\n",
       "      <td>5.6</td>\n",
       "      <td>2.8</td>\n",
       "      <td>4.9</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>122</th>\n",
       "      <td>7.7</td>\n",
       "      <td>2.8</td>\n",
       "      <td>6.7</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>123</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.7</td>\n",
       "      <td>4.9</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.3</td>\n",
       "      <td>5.7</td>\n",
       "      <td>2.1</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>125</th>\n",
       "      <td>7.2</td>\n",
       "      <td>3.2</td>\n",
       "      <td>6.0</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>126</th>\n",
       "      <td>6.2</td>\n",
       "      <td>2.8</td>\n",
       "      <td>4.8</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>127</th>\n",
       "      <td>6.1</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.9</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>128</th>\n",
       "      <td>6.4</td>\n",
       "      <td>2.8</td>\n",
       "      <td>5.6</td>\n",
       "      <td>2.1</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>129</th>\n",
       "      <td>7.2</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.8</td>\n",
       "      <td>1.6</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>130</th>\n",
       "      <td>7.4</td>\n",
       "      <td>2.8</td>\n",
       "      <td>6.1</td>\n",
       "      <td>1.9</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>131</th>\n",
       "      <td>7.9</td>\n",
       "      <td>3.8</td>\n",
       "      <td>6.4</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>132</th>\n",
       "      <td>6.4</td>\n",
       "      <td>2.8</td>\n",
       "      <td>5.6</td>\n",
       "      <td>2.2</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>133</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.8</td>\n",
       "      <td>5.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>134</th>\n",
       "      <td>6.1</td>\n",
       "      <td>2.6</td>\n",
       "      <td>5.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>135</th>\n",
       "      <td>7.7</td>\n",
       "      <td>3.0</td>\n",
       "      <td>6.1</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>136</th>\n",
       "      <td>6.3</td>\n",
       "      <td>3.4</td>\n",
       "      <td>5.6</td>\n",
       "      <td>2.4</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>137</th>\n",
       "      <td>6.4</td>\n",
       "      <td>3.1</td>\n",
       "      <td>5.5</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>138</th>\n",
       "      <td>6.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.8</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>139</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.1</td>\n",
       "      <td>5.4</td>\n",
       "      <td>2.1</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>140</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.1</td>\n",
       "      <td>5.6</td>\n",
       "      <td>2.4</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>141</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.1</td>\n",
       "      <td>5.1</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>142</th>\n",
       "      <td>5.8</td>\n",
       "      <td>2.7</td>\n",
       "      <td>5.1</td>\n",
       "      <td>1.9</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>143</th>\n",
       "      <td>6.8</td>\n",
       "      <td>3.2</td>\n",
       "      <td>5.9</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>144</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.3</td>\n",
       "      <td>5.7</td>\n",
       "      <td>2.5</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>145</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>1.9</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>147</th>\n",
       "      <td>6.5</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>148</th>\n",
       "      <td>6.2</td>\n",
       "      <td>3.4</td>\n",
       "      <td>5.4</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>149</th>\n",
       "      <td>5.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.1</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>150 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       0    1    2    3               4\n",
       "0    5.1  3.5  1.4  0.2     Iris-setosa\n",
       "1    4.9  3.0  1.4  0.2     Iris-setosa\n",
       "2    4.7  3.2  1.3  0.2     Iris-setosa\n",
       "3    4.6  3.1  1.5  0.2     Iris-setosa\n",
       "4    5.0  3.6  1.4  0.2     Iris-setosa\n",
       "5    5.4  3.9  1.7  0.4     Iris-setosa\n",
       "6    4.6  3.4  1.4  0.3     Iris-setosa\n",
       "7    5.0  3.4  1.5  0.2     Iris-setosa\n",
       "8    4.4  2.9  1.4  0.2     Iris-setosa\n",
       "9    4.9  3.1  1.5  0.1     Iris-setosa\n",
       "10   5.4  3.7  1.5  0.2     Iris-setosa\n",
       "11   4.8  3.4  1.6  0.2     Iris-setosa\n",
       "12   4.8  3.0  1.4  0.1     Iris-setosa\n",
       "13   4.3  3.0  1.1  0.1     Iris-setosa\n",
       "14   5.8  4.0  1.2  0.2     Iris-setosa\n",
       "15   5.7  4.4  1.5  0.4     Iris-setosa\n",
       "16   5.4  3.9  1.3  0.4     Iris-setosa\n",
       "17   5.1  3.5  1.4  0.3     Iris-setosa\n",
       "18   5.7  3.8  1.7  0.3     Iris-setosa\n",
       "19   5.1  3.8  1.5  0.3     Iris-setosa\n",
       "20   5.4  3.4  1.7  0.2     Iris-setosa\n",
       "21   5.1  3.7  1.5  0.4     Iris-setosa\n",
       "22   4.6  3.6  1.0  0.2     Iris-setosa\n",
       "23   5.1  3.3  1.7  0.5     Iris-setosa\n",
       "24   4.8  3.4  1.9  0.2     Iris-setosa\n",
       "25   5.0  3.0  1.6  0.2     Iris-setosa\n",
       "26   5.0  3.4  1.6  0.4     Iris-setosa\n",
       "27   5.2  3.5  1.5  0.2     Iris-setosa\n",
       "28   5.2  3.4  1.4  0.2     Iris-setosa\n",
       "29   4.7  3.2  1.6  0.2     Iris-setosa\n",
       "..   ...  ...  ...  ...             ...\n",
       "120  6.9  3.2  5.7  2.3  Iris-virginica\n",
       "121  5.6  2.8  4.9  2.0  Iris-virginica\n",
       "122  7.7  2.8  6.7  2.0  Iris-virginica\n",
       "123  6.3  2.7  4.9  1.8  Iris-virginica\n",
       "124  6.7  3.3  5.7  2.1  Iris-virginica\n",
       "125  7.2  3.2  6.0  1.8  Iris-virginica\n",
       "126  6.2  2.8  4.8  1.8  Iris-virginica\n",
       "127  6.1  3.0  4.9  1.8  Iris-virginica\n",
       "128  6.4  2.8  5.6  2.1  Iris-virginica\n",
       "129  7.2  3.0  5.8  1.6  Iris-virginica\n",
       "130  7.4  2.8  6.1  1.9  Iris-virginica\n",
       "131  7.9  3.8  6.4  2.0  Iris-virginica\n",
       "132  6.4  2.8  5.6  2.2  Iris-virginica\n",
       "133  6.3  2.8  5.1  1.5  Iris-virginica\n",
       "134  6.1  2.6  5.6  1.4  Iris-virginica\n",
       "135  7.7  3.0  6.1  2.3  Iris-virginica\n",
       "136  6.3  3.4  5.6  2.4  Iris-virginica\n",
       "137  6.4  3.1  5.5  1.8  Iris-virginica\n",
       "138  6.0  3.0  4.8  1.8  Iris-virginica\n",
       "139  6.9  3.1  5.4  2.1  Iris-virginica\n",
       "140  6.7  3.1  5.6  2.4  Iris-virginica\n",
       "141  6.9  3.1  5.1  2.3  Iris-virginica\n",
       "142  5.8  2.7  5.1  1.9  Iris-virginica\n",
       "143  6.8  3.2  5.9  2.3  Iris-virginica\n",
       "144  6.7  3.3  5.7  2.5  Iris-virginica\n",
       "145  6.7  3.0  5.2  2.3  Iris-virginica\n",
       "146  6.3  2.5  5.0  1.9  Iris-virginica\n",
       "147  6.5  3.0  5.2  2.0  Iris-virginica\n",
       "148  6.2  3.4  5.4  2.3  Iris-virginica\n",
       "149  5.9  3.0  5.1  1.8  Iris-virginica\n",
       "\n",
       "[150 rows x 5 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "irisdata = pd.read_csv('S1EP3_Iris.txt',header = None, encoding='utf-8')\n",
    "irisdata"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 快速的操作元数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "      <th>class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.9</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.3</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>4.4</td>\n",
       "      <td>2.9</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.1</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.7</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>4.8</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>4.8</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.1</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>4.3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>5.8</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.2</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>5.7</td>\n",
       "      <td>4.4</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.9</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.3</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>5.7</td>\n",
       "      <td>3.8</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.3</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.8</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.3</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.7</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.3</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.5</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>4.8</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.9</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>5.2</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>5.2</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>120</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.2</td>\n",
       "      <td>5.7</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>121</th>\n",
       "      <td>5.6</td>\n",
       "      <td>2.8</td>\n",
       "      <td>4.9</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>122</th>\n",
       "      <td>7.7</td>\n",
       "      <td>2.8</td>\n",
       "      <td>6.7</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>123</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.7</td>\n",
       "      <td>4.9</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.3</td>\n",
       "      <td>5.7</td>\n",
       "      <td>2.1</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>125</th>\n",
       "      <td>7.2</td>\n",
       "      <td>3.2</td>\n",
       "      <td>6.0</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>126</th>\n",
       "      <td>6.2</td>\n",
       "      <td>2.8</td>\n",
       "      <td>4.8</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>127</th>\n",
       "      <td>6.1</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.9</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>128</th>\n",
       "      <td>6.4</td>\n",
       "      <td>2.8</td>\n",
       "      <td>5.6</td>\n",
       "      <td>2.1</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>129</th>\n",
       "      <td>7.2</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.8</td>\n",
       "      <td>1.6</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>130</th>\n",
       "      <td>7.4</td>\n",
       "      <td>2.8</td>\n",
       "      <td>6.1</td>\n",
       "      <td>1.9</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>131</th>\n",
       "      <td>7.9</td>\n",
       "      <td>3.8</td>\n",
       "      <td>6.4</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>132</th>\n",
       "      <td>6.4</td>\n",
       "      <td>2.8</td>\n",
       "      <td>5.6</td>\n",
       "      <td>2.2</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>133</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.8</td>\n",
       "      <td>5.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>134</th>\n",
       "      <td>6.1</td>\n",
       "      <td>2.6</td>\n",
       "      <td>5.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>135</th>\n",
       "      <td>7.7</td>\n",
       "      <td>3.0</td>\n",
       "      <td>6.1</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>136</th>\n",
       "      <td>6.3</td>\n",
       "      <td>3.4</td>\n",
       "      <td>5.6</td>\n",
       "      <td>2.4</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>137</th>\n",
       "      <td>6.4</td>\n",
       "      <td>3.1</td>\n",
       "      <td>5.5</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>138</th>\n",
       "      <td>6.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.8</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>139</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.1</td>\n",
       "      <td>5.4</td>\n",
       "      <td>2.1</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>140</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.1</td>\n",
       "      <td>5.6</td>\n",
       "      <td>2.4</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>141</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.1</td>\n",
       "      <td>5.1</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>142</th>\n",
       "      <td>5.8</td>\n",
       "      <td>2.7</td>\n",
       "      <td>5.1</td>\n",
       "      <td>1.9</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>143</th>\n",
       "      <td>6.8</td>\n",
       "      <td>3.2</td>\n",
       "      <td>5.9</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>144</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.3</td>\n",
       "      <td>5.7</td>\n",
       "      <td>2.5</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>145</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>1.9</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>147</th>\n",
       "      <td>6.5</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>148</th>\n",
       "      <td>6.2</td>\n",
       "      <td>3.4</td>\n",
       "      <td>5.4</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>149</th>\n",
       "      <td>5.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.1</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>150 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal_length  sepal_width  petal_length  petal_width           class\n",
       "0             5.1          3.5           1.4          0.2     Iris-setosa\n",
       "1             4.9          3.0           1.4          0.2     Iris-setosa\n",
       "2             4.7          3.2           1.3          0.2     Iris-setosa\n",
       "3             4.6          3.1           1.5          0.2     Iris-setosa\n",
       "4             5.0          3.6           1.4          0.2     Iris-setosa\n",
       "5             5.4          3.9           1.7          0.4     Iris-setosa\n",
       "6             4.6          3.4           1.4          0.3     Iris-setosa\n",
       "7             5.0          3.4           1.5          0.2     Iris-setosa\n",
       "8             4.4          2.9           1.4          0.2     Iris-setosa\n",
       "9             4.9          3.1           1.5          0.1     Iris-setosa\n",
       "10            5.4          3.7           1.5          0.2     Iris-setosa\n",
       "11            4.8          3.4           1.6          0.2     Iris-setosa\n",
       "12            4.8          3.0           1.4          0.1     Iris-setosa\n",
       "13            4.3          3.0           1.1          0.1     Iris-setosa\n",
       "14            5.8          4.0           1.2          0.2     Iris-setosa\n",
       "15            5.7          4.4           1.5          0.4     Iris-setosa\n",
       "16            5.4          3.9           1.3          0.4     Iris-setosa\n",
       "17            5.1          3.5           1.4          0.3     Iris-setosa\n",
       "18            5.7          3.8           1.7          0.3     Iris-setosa\n",
       "19            5.1          3.8           1.5          0.3     Iris-setosa\n",
       "20            5.4          3.4           1.7          0.2     Iris-setosa\n",
       "21            5.1          3.7           1.5          0.4     Iris-setosa\n",
       "22            4.6          3.6           1.0          0.2     Iris-setosa\n",
       "23            5.1          3.3           1.7          0.5     Iris-setosa\n",
       "24            4.8          3.4           1.9          0.2     Iris-setosa\n",
       "25            5.0          3.0           1.6          0.2     Iris-setosa\n",
       "26            5.0          3.4           1.6          0.4     Iris-setosa\n",
       "27            5.2          3.5           1.5          0.2     Iris-setosa\n",
       "28            5.2          3.4           1.4          0.2     Iris-setosa\n",
       "29            4.7          3.2           1.6          0.2     Iris-setosa\n",
       "..            ...          ...           ...          ...             ...\n",
       "120           6.9          3.2           5.7          2.3  Iris-virginica\n",
       "121           5.6          2.8           4.9          2.0  Iris-virginica\n",
       "122           7.7          2.8           6.7          2.0  Iris-virginica\n",
       "123           6.3          2.7           4.9          1.8  Iris-virginica\n",
       "124           6.7          3.3           5.7          2.1  Iris-virginica\n",
       "125           7.2          3.2           6.0          1.8  Iris-virginica\n",
       "126           6.2          2.8           4.8          1.8  Iris-virginica\n",
       "127           6.1          3.0           4.9          1.8  Iris-virginica\n",
       "128           6.4          2.8           5.6          2.1  Iris-virginica\n",
       "129           7.2          3.0           5.8          1.6  Iris-virginica\n",
       "130           7.4          2.8           6.1          1.9  Iris-virginica\n",
       "131           7.9          3.8           6.4          2.0  Iris-virginica\n",
       "132           6.4          2.8           5.6          2.2  Iris-virginica\n",
       "133           6.3          2.8           5.1          1.5  Iris-virginica\n",
       "134           6.1          2.6           5.6          1.4  Iris-virginica\n",
       "135           7.7          3.0           6.1          2.3  Iris-virginica\n",
       "136           6.3          3.4           5.6          2.4  Iris-virginica\n",
       "137           6.4          3.1           5.5          1.8  Iris-virginica\n",
       "138           6.0          3.0           4.8          1.8  Iris-virginica\n",
       "139           6.9          3.1           5.4          2.1  Iris-virginica\n",
       "140           6.7          3.1           5.6          2.4  Iris-virginica\n",
       "141           6.9          3.1           5.1          2.3  Iris-virginica\n",
       "142           5.8          2.7           5.1          1.9  Iris-virginica\n",
       "143           6.8          3.2           5.9          2.3  Iris-virginica\n",
       "144           6.7          3.3           5.7          2.5  Iris-virginica\n",
       "145           6.7          3.0           5.2          2.3  Iris-virginica\n",
       "146           6.3          2.5           5.0          1.9  Iris-virginica\n",
       "147           6.5          3.0           5.2          2.0  Iris-virginica\n",
       "148           6.2          3.4           5.4          2.3  Iris-virginica\n",
       "149           5.9          3.0           5.1          1.8  Iris-virginica\n",
       "\n",
       "[150 rows x 5 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cnames = ['sepal_length','sepal_width','petal_length','petal_width','class']\n",
    "irisdata.columns = cnames\n",
    "irisdata"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 快速过滤"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "      <th>class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>100</th>\n",
       "      <td>6.3</td>\n",
       "      <td>3.3</td>\n",
       "      <td>6.0</td>\n",
       "      <td>2.5</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>109</th>\n",
       "      <td>7.2</td>\n",
       "      <td>3.6</td>\n",
       "      <td>6.1</td>\n",
       "      <td>2.5</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>144</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.3</td>\n",
       "      <td>5.7</td>\n",
       "      <td>2.5</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal_length  sepal_width  petal_length  petal_width           class\n",
       "100           6.3          3.3           6.0          2.5  Iris-virginica\n",
       "109           7.2          3.6           6.1          2.5  Iris-virginica\n",
       "144           6.7          3.3           5.7          2.5  Iris-virginica"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "irisdata[irisdata['petal_width']==irisdata.petal_width.max()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 快速切片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>4.8</td>\n",
       "      <td>3.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>5.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90</th>\n",
       "      <td>5.5</td>\n",
       "      <td>2.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>120</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal_length  sepal_width\n",
       "0             5.1          3.5\n",
       "30            4.8          3.1\n",
       "60            5.0          2.0\n",
       "90            5.5          2.6\n",
       "120           6.9          3.2"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "irisdata.iloc[::30,:2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 快速统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iris-setosa        50\n",
      "Iris-versicolor    50\n",
      "Iris-virginica     50\n",
      "dtype: int64\n",
      "SEPAL_LENGTH  Statistics:    7.9    4.3   5.84   0.83\n",
      "SEPAL_WIDTH   Statistics:    4.4    2.0   3.05   0.43\n",
      "PETAL_LENGTH  Statistics:    6.9    1.0   3.76   1.76\n",
      "PETAL_WIDTH   Statistics:    2.5    0.1    1.2   0.76\n"
     ]
    }
   ],
   "source": [
    "print irisdata['class'].value_counts()\n",
    "\n",
    "for x in xrange(4):\n",
    "    s = irisdata.iloc[:,x]\n",
    "    print '{0:<12}'.format(s.name.upper()), \" Statistics: \", \\\n",
    "    '{0:>5}  {1:>5}  {2:>5}  {3:>5}'.format(s.max(), s.min(), round(s.mean(),2),round(s.std(),2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 快速“MapReduce”"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>class</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Iris-setosa</th>\n",
       "      <td>49.878745</td>\n",
       "      <td>49.695242</td>\n",
       "      <td>49.654909</td>\n",
       "      <td>45.810069</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Iris-versicolor</th>\n",
       "      <td>49.815081</td>\n",
       "      <td>49.680665</td>\n",
       "      <td>49.694505</td>\n",
       "      <td>49.452305</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Iris-virginica</th>\n",
       "      <td>49.772059</td>\n",
       "      <td>49.714500</td>\n",
       "      <td>49.761700</td>\n",
       "      <td>49.545918</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 sepal_length  sepal_width  petal_length  petal_width\n",
       "class                                                                \n",
       "Iris-setosa         49.878745    49.695242     49.654909    45.810069\n",
       "Iris-versicolor     49.815081    49.680665     49.694505    49.452305\n",
       "Iris-virginica      49.772059    49.714500     49.761700    49.545918"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "slogs = lambda x:sp.log(x)*x\n",
    "entpy = lambda x:sp.exp((slogs(x.sum())-x.map(slogs).sum())/x.sum())\n",
    "irisdata.groupby('class').agg(entpy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. 欢迎来到大熊猫世界"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pandas的重要数据类型\n",
    "\n",
    "* DataFrame(二维表)\n",
    "* Series(一维序列)\n",
    "* Index(行索引，行级元数据)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.1 Series：pandas的长枪(数据表中的一列或一行,观测向量,一维数组...)\n",
    "\n",
    "数据世界中对于任意一个个体的全面观测，或者对于任意一组个体某一属性的观测，全部可以抽象为Series的概念。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用值构建一个Series：\n",
    "\n",
    "由默认index和values组成。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0   -0.909672\n",
      "1    1.739425\n",
      "2   -1.163028\n",
      "3    0.408693\n",
      "dtype: float64 <class 'pandas.core.series.Series'>\n",
      "Int64Index([0, 1, 2, 3], dtype='int64')\n",
      "[-0.90967166  1.73942495 -1.1630284   0.40869312]\n"
     ]
    }
   ],
   "source": [
    "Series1 = pd.Series(np.random.randn(4))\n",
    "print Series1,type(Series1)\n",
    "print Series1.index\n",
    "print Series1.values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Series支持过滤的原理就如同NumPy："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    False\n",
      "1     True\n",
      "2    False\n",
      "3     True\n",
      "dtype: bool\n",
      "1    1.739425\n",
      "3    0.408693\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "print Series1>0\n",
    "print Series1[Series1>0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 当然也支持Broadcasting："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0   -1.819343\n",
      "1    3.478850\n",
      "2   -2.326057\n",
      "3    0.817386\n",
      "dtype: float64\n",
      "0    4.090328\n",
      "1    6.739425\n",
      "2    3.836972\n",
      "3    5.408693\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "print Series1*2\n",
    "print Series1+5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 以及Universal Function："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    0.402656\n",
      "1    5.694068\n",
      "2    0.312538\n",
      "3    1.504850\n",
      "dtype: float64\n",
      "0    24.06255\n",
      "1    4811.913\n",
      "2    14.49702\n",
      "3    336.0924\n",
      "dtype: object\n"
     ]
    }
   ],
   "source": [
    "print np.exp(Series1)\n",
    "#NumPy Universal Function\n",
    "f_np = np.frompyfunc(lambda x:np.exp(x*2+5),1,1)\n",
    "print f_np(Series1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在序列上就使用行标，而不是创建一个2列的数据表，能够轻松辨别哪里是数据，哪里是元数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "norm_0   -0.909672\n",
      "norm_1    1.739425\n",
      "norm_2   -1.163028\n",
      "norm_3    0.408693\n",
      "dtype: float64 <class 'pandas.core.series.Series'>\n",
      "Index([u'norm_0', u'norm_1', u'norm_2', u'norm_3'], dtype='object')\n",
      "<class 'pandas.core.index.Index'>\n",
      "[-0.90967166  1.73942495 -1.1630284   0.40869312]\n"
     ]
    }
   ],
   "source": [
    "Series2 = pd.Series(Series1.values,index=['norm_'+unicode(i) for i in xrange(4)])\n",
    "print Series2,type(Series2)\n",
    "print Series2.index\n",
    "print type(Series2.index)\n",
    "print Series2.values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "虽然行是有顺序的，但是仍然能够通过行级的index来访问到数据：\n",
    "\n",
    "（当然也不尽然像Ordered Dict，因为行索引甚至可以重复，不推荐重复的行索引不代表不能用）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "norm_0   -0.909672\n",
      "norm_3    0.408693\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "print Series2[['norm_0','norm_3']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "False\n"
     ]
    }
   ],
   "source": [
    "print 'norm_0' in Series2\n",
    "print 'norm_6' in Series2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "默认行索引就像行号一样："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Int64Index([0, 1, 2, 3], dtype='int64')\n"
     ]
    }
   ],
   "source": [
    "print Series1.index"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从Key不重复的Ordered Dict或者从Dict来定义Series就不需要担心行索引重复："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "China      Beijing\n",
      "Japan        Tokyo\n",
      "S.Korea      Seoul\n",
      "dtype: object\n",
      "['Beijing' 'Tokyo' 'Seoul']\n",
      "Index([u'China', u'Japan', u'S.Korea'], dtype='object')\n"
     ]
    }
   ],
   "source": [
    "Series3_Dict = {\"Japan\":\"Tokyo\",\"S.Korea\":\"Seoul\",\"China\":\"Beijing\"}\n",
    "Series3_pdSeries = pd.Series(Series3_Dict)\n",
    "print Series3_pdSeries\n",
    "print Series3_pdSeries.values\n",
    "print Series3_pdSeries.index"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "与Dict区别一： 有序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Japan          Tokyo\n",
      "China        Beijing\n",
      "Singapore        NaN\n",
      "S.Korea        Seoul\n",
      "dtype: object\n",
      "['Tokyo' 'Beijing' nan 'Seoul']\n",
      "Index([u'Japan', u'China', u'Singapore', u'S.Korea'], dtype='object')\n",
      "Japan        False\n",
      "China        False\n",
      "Singapore     True\n",
      "S.Korea      False\n",
      "dtype: bool\n",
      "Japan         True\n",
      "China         True\n",
      "Singapore    False\n",
      "S.Korea       True\n",
      "dtype: bool\n"
     ]
    }
   ],
   "source": [
    "Series4_IndexList = [\"Japan\",\"China\",\"Singapore\",\"S.Korea\"]\n",
    "Series4_pdSeries = pd.Series( Series3_Dict ,index = Series4_IndexList)\n",
    "print Series4_pdSeries\n",
    "print Series4_pdSeries.values\n",
    "print Series4_pdSeries.index\n",
    "print Series4_pdSeries.isnull()\n",
    "print Series4_pdSeries.notnull()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "与Dict区别二： index内值可以重复，尽管不推荐。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A   -0.909672\n",
      "B    1.739425\n",
      "B   -1.163028\n",
      "C    0.408693\n",
      "dtype: float64\n",
      "B    1.739425\n",
      "B   -1.163028\n",
      "A   -0.909672\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "Series5_IndexList = ['A','B','B','C']\n",
    "Series5 = pd.Series(Series1.values,index = Series5_IndexList)\n",
    "print Series5\n",
    "print Series5[['B','A']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "整个序列级别的元数据信息：name\n",
    "\n",
    "当数据序列以及index本身有了名字，就可以更方便的进行后续的数据关联啦！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "None\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "print Series4_pdSeries.name\n",
    "print Series4_pdSeries.index.name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Nation\n",
      "Japan          Tokyo\n",
      "China        Beijing\n",
      "Singapore        NaN\n",
      "S.Korea        Seoul\n",
      "Name: Capital Series, dtype: object\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Capital Series</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Nation</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Japan</th>\n",
       "      <td>Tokyo</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>China</th>\n",
       "      <td>Beijing</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Singapore</th>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>S.Korea</th>\n",
       "      <td>Seoul</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          Capital Series\n",
       "Nation                  \n",
       "Japan              Tokyo\n",
       "China            Beijing\n",
       "Singapore            NaN\n",
       "S.Korea            Seoul"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Series4_pdSeries.name = \"Capital Series\"\n",
    "Series4_pdSeries.index.name = \"Nation\"\n",
    "print Series4_pdSeries\n",
    "pd.DataFrame(Series4_pdSeries)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.2 DataFrame：pandas的战锤(数据表，二维数组)\n",
    "\n",
    "Series的有序集合，就像R的DataFrame一样方便。\n",
    "\n",
    "仔细想想，绝大部分的数据形式都可以表现为DataFrame。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 从NumPy二维数组、从文件或者从数据库定义：数据虽好，勿忘列名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP\n",
       "0    Japan    Tokyo  4000\n",
       "1  S.Korea    Seoul  1300\n",
       "2    China  Beijing  9100"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataNumPy = np.asarray([('Japan','Tokyo',4000),\\\n",
    "                ('S.Korea','Seoul',1300),('China','Beijing',9100)])\n",
    "DF1 = pd.DataFrame(dataNumPy,columns=['nation','capital','GDP'])\n",
    "DF1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### 等长的列数据保存在一个字典里（JSON）：很不幸，字典key是无序的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>GDP</th>\n",
       "      <th>capital</th>\n",
       "      <th>nation</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4900</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>Japan</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1300</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>S.Korea</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>9100</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>China</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    GDP  capital   nation\n",
       "0  4900    Tokyo    Japan\n",
       "1  1300    Seoul  S.Korea\n",
       "2  9100  Beijing    China"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataDict = {'nation':['Japan','S.Korea','China'],\\\n",
    "        'capital':['Tokyo','Seoul','Beijing'],'GDP':[4900,1300,9100]}\n",
    "DF2 = pd.DataFrame(dataDict)\n",
    "DF2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### 从另一个DataFrame定义DataFrame：啊，强迫症犯了！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP\n",
       "0    Japan    Tokyo  4900\n",
       "1  S.Korea    Seoul  1300\n",
       "2    China  Beijing  9100"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF21 = pd.DataFrame(DF2,columns=['nation','capital','GDP'])\n",
    "DF21"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP\n",
       "2    China  Beijing  9100\n",
       "0    Japan    Tokyo  4900\n",
       "1  S.Korea    Seoul  1300"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF22 = pd.DataFrame(DF2,columns=['nation','capital','GDP'],index = [2,0,1])\n",
    "DF22"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### 从DataFrame中取出列？两种方法（与JavaScript完全一致！）\n",
    "\n",
    "* '.'的写法容易与其他预留关键字产生冲突\n",
    "* '[ ]'的写法最安全。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2      China\n",
      "0      Japan\n",
      "1    S.Korea\n",
      "Name: nation, dtype: object\n",
      "2    Beijing\n",
      "0      Tokyo\n",
      "1      Seoul\n",
      "Name: capital, dtype: object\n",
      "2    9100\n",
      "0    4900\n",
      "1    1300\n",
      "Name: GDP, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print DF22.nation\n",
    "print DF22.capital\n",
    "print DF22['GDP']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 从DataFrame中取出行？（至少）两种方法："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  nation  capital   GDP\n",
      "2  China  Beijing  9100\n",
      "nation     Japan\n",
      "capital    Tokyo\n",
      "GDP         4900\n",
      "Name: 0, dtype: object\n"
     ]
    }
   ],
   "source": [
    "print DF22[0:1] #给出的实际是DataFrame\n",
    "print DF22.ix[0] #通过对应Index给出行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 像NumPy切片一样的终极招式：iloc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "nation       China\n",
      "capital    Beijing\n",
      "GDP           9100\n",
      "Name: 2, dtype: object\n",
      "2      China\n",
      "0      Japan\n",
      "1    S.Korea\n",
      "Name: nation, dtype: object\n"
     ]
    }
   ],
   "source": [
    "print DF22.iloc[0,:]\n",
    "print DF22.iloc[:,0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### 听说你从Alter Table地狱来，大熊猫笑了\n",
    "\n",
    "然而动态增加列无法用\".\"的方式完成，只能用\"[ ]\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "      <th>population</th>\n",
       "      <th>region</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "      <td>1600</td>\n",
       "      <td>East_Asian</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4900</td>\n",
       "      <td>130</td>\n",
       "      <td>East_Asian</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "      <td>55</td>\n",
       "      <td>East_Asian</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP  population      region\n",
       "2    China  Beijing  9100        1600  East_Asian\n",
       "0    Japan    Tokyo  4900         130  East_Asian\n",
       "1  S.Korea    Seoul  1300          55  East_Asian"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF22['population'] = [1600,130,55]\n",
    "DF22['region'] = 'East_Asian'\n",
    "DF22"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.3 Index：pandas进行数据操纵的鬼牌（行级索引）\n",
    "\n",
    "行级索引是\n",
    "\n",
    "* 元数据\n",
    "* 可能由真实数据产生，因此可以视作数据\n",
    "* 可以由多重索引也就是多个列组合而成\n",
    "* 可以和列名进行交换，也可以进行堆叠和展开，达到Excel透视表效果\n",
    "\n",
    "Index有四种...哦不，很多种写法，一些重要的索引类型包括\n",
    "\n",
    "* pd.Index（普通）\n",
    "* Int64Index（数值型索引）\n",
    "* MultiIndex（多重索引，在数据操纵中更详细描述）\n",
    "* DatetimeIndex（以时间格式作为索引）\n",
    "* PeriodIndex （含周期的时间格式作为索引）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### 直接定义普通索引，长得就和普通的Series一样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index([u'a', u'b', u'c'], dtype='object')\n",
      "Index([u'a', u'b', u'c'], dtype='object')\n"
     ]
    }
   ],
   "source": [
    "index_names = ['a','b','c']\n",
    "Series_for_Index = pd.Series(index_names)\n",
    "print pd.Index(index_names)\n",
    "print pd.Index(Series_for_Index)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 可惜Immutable，牢记！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['a' 'b' 'c']\n"
     ]
    },
    {
     "ename": "TypeError",
     "evalue": "Indexes does not support mutable operations",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-32-f34da0a8623c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0mindex0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIndex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex_names\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mindex0\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mindex0\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'd'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/Users/wangweiyang/anaconda/anaconda/lib/python2.7/site-packages/pandas/core/index.pyc\u001b[0m in \u001b[0;36m__setitem__\u001b[0;34m(self, key, value)\u001b[0m\n\u001b[1;32m   1055\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1056\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__setitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1057\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Indexes does not support mutable operations\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1058\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1059\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mTypeError\u001b[0m: Indexes does not support mutable operations"
     ]
    }
   ],
   "source": [
    "index_names = ['a','b','c']\n",
    "index0 = pd.Index(index_names)\n",
    "print index0.get_values()\n",
    "index0[2] = 'd'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 扔进去一个含有多元组的List，就有了MultiIndex\n",
    "\n",
    "可惜，如果这个List Comprehension改成小括号，就不对了。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MultiIndex(levels=[[u'Row_1', u'Row_2', u'Row_3', u'Row_4'], [u'Col_1', u'Col_2', u'Col_3', u'Col_4']],\n",
      "           labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]])\n"
     ]
    }
   ],
   "source": [
    "#print [('Row_'+str(x+1),'Col_'+str(y+1)) for x in xrange(4) for y in xrange(4)]\n",
    "multi1 = pd.Index([('Row_'+str(x+1),'Col_'+str(y+1)) for x in xrange(4) for y in xrange(4)])\n",
    "multi1.name = ['index1','index2']\n",
    "print multi1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 对于Series来说，如果拥有了多重Index，数据，变形！\n",
    "\n",
    "下列代码说明：\n",
    "\n",
    "* 二重MultiIndex的Series可以unstack()成DataFrame\n",
    "* DataFrame可以stack成拥有二重MultiIndex的Series"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Row_1  Col_1     0\n",
       "       Col_2     1\n",
       "       Col_3     2\n",
       "       Col_4     3\n",
       "Row_2  Col_1     4\n",
       "       Col_2     5\n",
       "       Col_3     6\n",
       "       Col_4     7\n",
       "Row_3  Col_1     8\n",
       "       Col_2     9\n",
       "       Col_3    10\n",
       "       Col_4    11\n",
       "Row_4  Col_1    12\n",
       "       Col_2    13\n",
       "       Col_3    14\n",
       "       Col_4    15\n",
       "dtype: int64"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_for_multi1 = pd.Series(xrange(0,16),index=multi1)\n",
    "data_for_multi1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Col_1</th>\n",
       "      <th>Col_2</th>\n",
       "      <th>Col_3</th>\n",
       "      <th>Col_4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Row_1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_2</th>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_3</th>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>10</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_4</th>\n",
       "      <td>12</td>\n",
       "      <td>13</td>\n",
       "      <td>14</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Col_1  Col_2  Col_3  Col_4\n",
       "Row_1      0      1      2      3\n",
       "Row_2      4      5      6      7\n",
       "Row_3      8      9     10     11\n",
       "Row_4     12     13     14     15"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_for_multi1.unstack()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Row_1  Col_1     0\n",
       "       Col_2     1\n",
       "       Col_3     2\n",
       "       Col_4     3\n",
       "Row_2  Col_1     4\n",
       "       Col_2     5\n",
       "       Col_3     6\n",
       "       Col_4     7\n",
       "Row_3  Col_1     8\n",
       "       Col_2     9\n",
       "       Col_3    10\n",
       "       Col_4    11\n",
       "Row_4  Col_1    12\n",
       "       Col_2    13\n",
       "       Col_3    14\n",
       "       Col_4    15\n",
       "dtype: int64"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_for_multi1.unstack().stack()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们来看一下非平衡数据的例子：\n",
    "\n",
    "Row_1,2,3,4和Col_1,2,3,4并不是全组合的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MultiIndex(levels=[[u'Row_1', u'Row_2', u'Row_3', u'Row_4'], [u'Col_1', u'Col_2', u'Col_3', u'Col_4']],\n",
       "           labels=[[0, 1, 1, 2, 2, 2, 3, 3, 3, 3], [0, 0, 1, 0, 1, 2, 0, 1, 2, 3]])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "multi2 = pd.Index([('Row_'+str(x),'Col_'+str(y+1)) \\\n",
    "                   for x in xrange(5) for y in xrange(x)])\n",
    "multi2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Row_1  Col_1    0\n",
       "Row_2  Col_1    1\n",
       "       Col_2    2\n",
       "Row_3  Col_1    3\n",
       "       Col_2    4\n",
       "       Col_3    5\n",
       "Row_4  Col_1    6\n",
       "       Col_2    7\n",
       "       Col_3    8\n",
       "       Col_4    9\n",
       "dtype: int64"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_for_multi2 = pd.Series(np.arange(10),index = multi2)\n",
    "data_for_multi2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Col_1</th>\n",
       "      <th>Col_2</th>\n",
       "      <th>Col_3</th>\n",
       "      <th>Col_4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Row_1</th>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_2</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_3</th>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_4</th>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Col_1  Col_2  Col_3  Col_4\n",
       "Row_1      0    NaN    NaN    NaN\n",
       "Row_2      1      2    NaN    NaN\n",
       "Row_3      3      4      5    NaN\n",
       "Row_4      6      7      8      9"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_for_multi2.unstack()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Row_1  Col_1    0\n",
       "Row_2  Col_1    1\n",
       "       Col_2    2\n",
       "Row_3  Col_1    3\n",
       "       Col_2    4\n",
       "       Col_3    5\n",
       "Row_4  Col_1    6\n",
       "       Col_2    7\n",
       "       Col_3    8\n",
       "       Col_4    9\n",
       "dtype: float64"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_for_multi2.unstack().stack()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### DateTime标准库如此好用，你值得拥有"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2015-01-01', '2015-01-08', '2015-01-30'], dtype='datetime64[ns]', freq=None, tz=None)"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dates = [datetime.datetime(2015,1,1),datetime.datetime(2015,1,8),datetime.datetime(2015,1,30)]\n",
    "pd.DatetimeIndex(dates)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 如果你不仅需要时间格式统一，时间频率也要统一的话"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PeriodIndex(['2015-01', '2015-02', '2015-03', '2015-04'], dtype='int64', freq='M')\n"
     ]
    }
   ],
   "source": [
    "periodindex1 = pd.period_range('2015-01','2015-04',freq='M')\n",
    "print periodindex1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 月级精度和日级精度如何转换？\n",
    "\n",
    "有的公司统一以1号代表当月，有的公司统一以最后一天代表当月，转化起来很麻烦，可以asfreq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PeriodIndex(['2015-01-01', '2015-02-01', '2015-03-01', '2015-04-01'], dtype='int64', freq='D')\n",
      "PeriodIndex(['2015-01-31', '2015-02-28', '2015-03-31', '2015-04-30'], dtype='int64', freq='D')\n"
     ]
    }
   ],
   "source": [
    "print periodindex1.asfreq('D',how='start')\n",
    "print periodindex1.asfreq('D',how='end')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 最后的最后，我要真正把两种频率的时间精度匹配上？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PeriodIndex(['2015-01-01', '2015-02-01', '2015-03-01'], dtype='int64', freq='D')\n",
      "PeriodIndex(['2015-01-01', '2015-01-02', '2015-01-03', '2015-01-04',\n",
      "             '2015-01-05', '2015-01-06', '2015-01-07', '2015-01-08',\n",
      "             '2015-01-09', '2015-01-10', '2015-01-11', '2015-01-12',\n",
      "             '2015-01-13', '2015-01-14', '2015-01-15', '2015-01-16',\n",
      "             '2015-01-17', '2015-01-18', '2015-01-19', '2015-01-20',\n",
      "             '2015-01-21', '2015-01-22', '2015-01-23', '2015-01-24',\n",
      "             '2015-01-25', '2015-01-26', '2015-01-27', '2015-01-28',\n",
      "             '2015-01-29', '2015-01-30', '2015-01-31', '2015-02-01',\n",
      "             '2015-02-02', '2015-02-03', '2015-02-04', '2015-02-05',\n",
      "             '2015-02-06', '2015-02-07', '2015-02-08', '2015-02-09',\n",
      "             '2015-02-10', '2015-02-11', '2015-02-12', '2015-02-13',\n",
      "             '2015-02-14', '2015-02-15', '2015-02-16', '2015-02-17',\n",
      "             '2015-02-18', '2015-02-19', '2015-02-20', '2015-02-21',\n",
      "             '2015-02-22', '2015-02-23', '2015-02-24', '2015-02-25',\n",
      "             '2015-02-26', '2015-02-27', '2015-02-28', '2015-03-01',\n",
      "             '2015-03-02', '2015-03-03', '2015-03-04', '2015-03-05',\n",
      "             '2015-03-06', '2015-03-07', '2015-03-08', '2015-03-09',\n",
      "             '2015-03-10', '2015-03-11', '2015-03-12', '2015-03-13',\n",
      "             '2015-03-14', '2015-03-15', '2015-03-16', '2015-03-17',\n",
      "             '2015-03-18', '2015-03-19', '2015-03-20', '2015-03-21',\n",
      "             '2015-03-22', '2015-03-23', '2015-03-24', '2015-03-25',\n",
      "             '2015-03-26', '2015-03-27', '2015-03-28', '2015-03-29',\n",
      "             '2015-03-30', '2015-03-31'],\n",
      "            dtype='int64', freq='D')\n"
     ]
    }
   ],
   "source": [
    "periodindex_mon = pd.period_range('2015-01','2015-03',freq='M').asfreq('D',how='start')\n",
    "periodindex_day = pd.period_range('2015-01-01','2015-03-31',freq='D')\n",
    "\n",
    "print periodindex_mon\n",
    "print periodindex_day"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 粗粒度数据＋reindex＋ffill/bfill"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2015-01-01    2015-01-01\n",
       "2015-01-02           NaN\n",
       "2015-01-03           NaN\n",
       "2015-01-04           NaN\n",
       "2015-01-05           NaN\n",
       "2015-01-06           NaN\n",
       "2015-01-07           NaN\n",
       "2015-01-08           NaN\n",
       "2015-01-09           NaN\n",
       "2015-01-10           NaN\n",
       "2015-01-11           NaN\n",
       "2015-01-12           NaN\n",
       "2015-01-13           NaN\n",
       "2015-01-14           NaN\n",
       "2015-01-15           NaN\n",
       "2015-01-16           NaN\n",
       "2015-01-17           NaN\n",
       "2015-01-18           NaN\n",
       "2015-01-19           NaN\n",
       "2015-01-20           NaN\n",
       "2015-01-21           NaN\n",
       "2015-01-22           NaN\n",
       "2015-01-23           NaN\n",
       "2015-01-24           NaN\n",
       "2015-01-25           NaN\n",
       "2015-01-26           NaN\n",
       "2015-01-27           NaN\n",
       "2015-01-28           NaN\n",
       "2015-01-29           NaN\n",
       "2015-01-30           NaN\n",
       "                 ...    \n",
       "2015-03-02           NaN\n",
       "2015-03-03           NaN\n",
       "2015-03-04           NaN\n",
       "2015-03-05           NaN\n",
       "2015-03-06           NaN\n",
       "2015-03-07           NaN\n",
       "2015-03-08           NaN\n",
       "2015-03-09           NaN\n",
       "2015-03-10           NaN\n",
       "2015-03-11           NaN\n",
       "2015-03-12           NaN\n",
       "2015-03-13           NaN\n",
       "2015-03-14           NaN\n",
       "2015-03-15           NaN\n",
       "2015-03-16           NaN\n",
       "2015-03-17           NaN\n",
       "2015-03-18           NaN\n",
       "2015-03-19           NaN\n",
       "2015-03-20           NaN\n",
       "2015-03-21           NaN\n",
       "2015-03-22           NaN\n",
       "2015-03-23           NaN\n",
       "2015-03-24           NaN\n",
       "2015-03-25           NaN\n",
       "2015-03-26           NaN\n",
       "2015-03-27           NaN\n",
       "2015-03-28           NaN\n",
       "2015-03-29           NaN\n",
       "2015-03-30           NaN\n",
       "2015-03-31           NaN\n",
       "Freq: D, dtype: object"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#print pd.Series(periodindex_mon,index=periodindex_mon).reindex(periodindex_day)\n",
    "full_ts = pd.Series(periodindex_mon,index=periodindex_mon).reindex(periodindex_day)\n",
    "full_ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2015-01-01    2015-01-01\n",
       "2015-01-02    2015-01-01\n",
       "2015-01-03    2015-01-01\n",
       "2015-01-04    2015-01-01\n",
       "2015-01-05    2015-01-01\n",
       "2015-01-06    2015-01-01\n",
       "2015-01-07    2015-01-01\n",
       "2015-01-08    2015-01-01\n",
       "2015-01-09    2015-01-01\n",
       "2015-01-10    2015-01-01\n",
       "2015-01-11    2015-01-01\n",
       "2015-01-12    2015-01-01\n",
       "2015-01-13    2015-01-01\n",
       "2015-01-14    2015-01-01\n",
       "2015-01-15    2015-01-01\n",
       "2015-01-16    2015-01-01\n",
       "2015-01-17    2015-01-01\n",
       "2015-01-18    2015-01-01\n",
       "2015-01-19    2015-01-01\n",
       "2015-01-20    2015-01-01\n",
       "2015-01-21    2015-01-01\n",
       "2015-01-22    2015-01-01\n",
       "2015-01-23    2015-01-01\n",
       "2015-01-24    2015-01-01\n",
       "2015-01-25    2015-01-01\n",
       "2015-01-26    2015-01-01\n",
       "2015-01-27    2015-01-01\n",
       "2015-01-28    2015-01-01\n",
       "2015-01-29    2015-01-01\n",
       "2015-01-30    2015-01-01\n",
       "                 ...    \n",
       "2015-03-02    2015-03-01\n",
       "2015-03-03    2015-03-01\n",
       "2015-03-04    2015-03-01\n",
       "2015-03-05    2015-03-01\n",
       "2015-03-06    2015-03-01\n",
       "2015-03-07    2015-03-01\n",
       "2015-03-08    2015-03-01\n",
       "2015-03-09    2015-03-01\n",
       "2015-03-10    2015-03-01\n",
       "2015-03-11    2015-03-01\n",
       "2015-03-12    2015-03-01\n",
       "2015-03-13    2015-03-01\n",
       "2015-03-14    2015-03-01\n",
       "2015-03-15    2015-03-01\n",
       "2015-03-16    2015-03-01\n",
       "2015-03-17    2015-03-01\n",
       "2015-03-18    2015-03-01\n",
       "2015-03-19    2015-03-01\n",
       "2015-03-20    2015-03-01\n",
       "2015-03-21    2015-03-01\n",
       "2015-03-22    2015-03-01\n",
       "2015-03-23    2015-03-01\n",
       "2015-03-24    2015-03-01\n",
       "2015-03-25    2015-03-01\n",
       "2015-03-26    2015-03-01\n",
       "2015-03-27    2015-03-01\n",
       "2015-03-28    2015-03-01\n",
       "2015-03-29    2015-03-01\n",
       "2015-03-30    2015-03-01\n",
       "2015-03-31    2015-03-01\n",
       "Freq: D, dtype: object"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "full_ts = pd.Series(periodindex_mon,index=periodindex_mon).reindex(periodindex_day,method='ffill')\n",
    "full_ts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 关于索引，方便的操作有？\n",
    "\n",
    "前面描述过了，索引有序，重复，但一定程度上又能通过key来访问，也就是说，某些集合操作都是可以支持的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index([u'A', u'B', u'B', u'C', u'C', u'C', u'D', u'E', u'E', u'F'], dtype='object')\n",
      "Index([u'A', u'B'], dtype='object')\n",
      "Index([u'C', u'C'], dtype='object')\n",
      "Index([u'A', u'B', u'B', u'C', u'C', u'D', u'E', u'E', u'F'], dtype='object')\n",
      "[False False False  True  True]\n",
      "Index([u'A', u'B', u'C', u'C'], dtype='object')\n",
      "Index([u'K', u'A', u'B', u'B', u'C', u'C'], dtype='object')\n",
      "Index([u'B', u'C'], dtype='object')\n",
      "True True False\n",
      "False False True\n"
     ]
    }
   ],
   "source": [
    "index1 = pd.Index(['A','B','B','C','C'])\n",
    "index2 = pd.Index(['C','D','E','E','F'])\n",
    "index3 = pd.Index(['B','C','A'])\n",
    "print index1.append(index2)\n",
    "print index1.difference(index2)\n",
    "print index1.intersection(index2)\n",
    "print index1.union(index2) # Support unique-value Index well\n",
    "print index1.isin(index2)\n",
    "print index1.delete(2)\n",
    "print index1.insert(0,'K') # Not suggested\n",
    "print index3.drop('A') # Support unique-value Index well\n",
    "print index1.is_monotonic,index2.is_monotonic,index3.is_monotonic\n",
    "print index1.is_unique,index2.is_unique,index3.is_unique"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 大熊猫世界来去自如：Pandas的I/O"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "老生常谈，从基础来看，我们仍然关心pandas对于与外部数据是如何交互的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.1 结构化数据输入输出"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* read_csv与to_csv 是一对输入输出的工具，read_csv直接返回pandas.DataFrame，而to_csv只要执行命令即可写文件\n",
    "  * read_table：功能类似\n",
    "  * read_fwf：操作fixed width file\n",
    "* read_excel与to_excel方便的与excel交互"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "还记得刚开始的例子吗？\n",
    "\n",
    "* header 表示数据中是否存在列名，如果在第0行就写就写0，并且开始读数据时跳过相应的行数，不存在可以写none\n",
    "* names 表示要用给定的列名来作为最终的列名\n",
    "* encoding 表示数据集的字符编码，通常而言一份数据为了方便的进行文件传输都以utf-8作为标准\n",
    "\n",
    "提问：下列例子中，header=4，names=cnames时，究竟会读到怎样的数据？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "      <th>class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>4.8</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>5.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Iris-versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90</th>\n",
       "      <td>5.5</td>\n",
       "      <td>2.6</td>\n",
       "      <td>4.4</td>\n",
       "      <td>1.2</td>\n",
       "      <td>Iris-versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>120</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.2</td>\n",
       "      <td>5.7</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal_length  sepal_width  petal_length  petal_width            class\n",
       "0             5.1          3.5           1.4          0.2      Iris-setosa\n",
       "30            4.8          3.1           1.6          0.2      Iris-setosa\n",
       "60            5.0          2.0           3.5          1.0  Iris-versicolor\n",
       "90            5.5          2.6           4.4          1.2  Iris-versicolor\n",
       "120           6.9          3.2           5.7          2.3   Iris-virginica"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print cnames\n",
    "irisdata = pd.read_csv('S1EP3_Iris.txt',header = None, names = cnames,\\\n",
    "                       encoding='utf-8')\n",
    "irisdata[::30]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "希望了解全部参数的请移步API：\n",
    "\n",
    "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html#pandas.read_csv\n",
    "\n",
    "这里介绍一些常用的参数：\n",
    "\n",
    "读取处理：\n",
    "\n",
    "* skiprows：跳过一定的行数\n",
    "* nrows：仅读取一定的行数\n",
    "* skipfooter：尾部有固定的行数永不读取\n",
    "* skip_blank_lines：空行跳过\n",
    "\n",
    "内容处理：\n",
    "\n",
    "* sep/delimiter：分隔符很重要，常见的有逗号，空格和Tab('\\t')\n",
    "* na_values：指定应该被当作na_values的数值\n",
    "* thousands：处理数值类型时，每千位分隔符并不统一 (1.234.567,89或者1,234,567.89都可能)，此时要把字符串转化为数字需要指明千位分隔符\n",
    "\n",
    "收尾处理：\n",
    "\n",
    "* index_col：将真实的某列（列的数目，甚至列名）当作index\n",
    "* squeeze：仅读到一列时，不再保存为pandas.DataFrame而是pandas.Series\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.1.x Excel ... ?\n",
    "\n",
    "对于存储着极为规整数据的Excel而言，其实是没必要一定用Excel来存，尽管Pandas也十分友好的提供了I/O接口。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "      <th>class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>4.8</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>5.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Iris-versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90</th>\n",
       "      <td>5.5</td>\n",
       "      <td>2.6</td>\n",
       "      <td>4.4</td>\n",
       "      <td>1.2</td>\n",
       "      <td>Iris-versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>120</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.2</td>\n",
       "      <td>5.7</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal_length  sepal_width  petal_length  petal_width            class\n",
       "0             5.1          3.5           1.4          0.2      Iris-setosa\n",
       "30            4.8          3.1           1.6          0.2      Iris-setosa\n",
       "60            5.0          2.0           3.5          1.0  Iris-versicolor\n",
       "90            5.5          2.6           4.4          1.2  Iris-versicolor\n",
       "120           6.9          3.2           5.7          2.3   Iris-virginica"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "irisdata.to_excel('S1EP3_irisdata.xls',index = None,encoding='utf-8')\n",
    "irisdata_from_excel = pd.read_excel('S1EP3_irisdata.xls',header=0, encoding='utf-8')\n",
    "irisdata_from_excel[::30]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "唯一重要的参数：sheetname=k，标志着一个excel的第k个sheet页将会被取出。（从0开始）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2 半结构化数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "JSON：网络传输中常用的一种数据格式。\n",
    "\n",
    "仔细看一下，实际上这就是我们平时收集到异源数据的风格是一致的：\n",
    "\n",
    "* 列名不能完全匹配\n",
    "* 关联键可能并不唯一\n",
    "* 元数据被保存在数据里"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>job</th>\n",
       "      <th>sal</th>\n",
       "      <th>report</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    name      job    sal   report\n",
       "0   Wang       VP  50000      NaN\n",
       "1  Zhang  Manager    NaN       VP\n",
       "2     Li      NaN   5000  Manager"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "json_data = [{'name':'Wang','sal':50000,'job':'VP'},\\\n",
    "             {'name':'Zhang','job':'Manager','report':'VP'},\\\n",
    "             {'name':'Li','sal':5000,'report':'Manager'}]\n",
    "data_employee = pd.read_json(json.dumps(json_data))\n",
    "data_employee_ri = data_employee.reindex(columns=['name','job','sal','report'])\n",
    "data_employee_ri"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.3 数据库连接流程（Optional）\n",
    "\n",
    "使用下列包，通过数据库配置建立Connection\n",
    "\n",
    "* pymysql\n",
    "* pyODBC\n",
    "* cx_Oracle\n",
    "\n",
    "通过pandas.read_sql_query,read_sql_table,to_sql进行数据库操作。\n",
    "\n",
    "Python与数据库的交互方案有很多种，从数据分析师角度看pandas方案比较适合，之后的讲义中会结合SQL语法进行讲解。\n",
    "\n",
    "进行数据库连接首先你需要类似的这样一组信息："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "IP = '127.0.0.1'\n",
    "us = 'root'\n",
    "pw = '123456'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "举例说明如果是MySQL："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pymysql\n",
    "import pymysql.cursors\n",
    "connection = pymysql.connect(host=IP,\\\n",
    "                             user=us,\\\n",
    "                             password=pw,\\\n",
    "                             charset='utf8mb4',\\\n",
    "                             cursorclass=pymysql.cursors.DictCursor)\n",
    "#pd.read_sql_query(\"sql\",connection)\n",
    "#df.to_sql('tablename',connection,flavor='mysql')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 深入Pandas数据操纵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "在第一部分的基础上，数据会有更多种操纵方式：\n",
    "\n",
    "* 通过列名、行index来取数据，结合ix、iloc灵活的获取数据的一个子集（第一部分已经介绍）\n",
    "* 按记录拼接（就像Union All）或者关联（join）\n",
    "* 方便的自定义函数映射\n",
    "* 排序\n",
    "* 缺失值处理\n",
    "* 与Excel一样灵活的数据透视表（在第四部分更详细介绍）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### 3.1 数据整合：方便灵活"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1.1 横向拼接：直接DataFrame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>C1</th>\n",
       "      <th>C2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.958384</td>\n",
       "      <td>0.826066</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.607771</td>\n",
       "      <td>0.687302</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.943502</td>\n",
       "      <td>0.647464</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         C1        C2\n",
       "0  0.958384  0.826066\n",
       "1  0.607771  0.687302\n",
       "2  0.943502  0.647464"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame([np.random.rand(2),np.random.rand(2),np.random.rand(2)],columns=['C1','C2'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1.2 横向拼接：Concatenate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>job</th>\n",
       "      <th>sal</th>\n",
       "      <th>report</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    name      job    sal   report\n",
       "0   Wang       VP  50000      NaN\n",
       "1  Zhang  Manager    NaN       VP\n",
       "2     Li      NaN   5000  Manager\n",
       "0   Wang       VP  50000      NaN\n",
       "1  Zhang  Manager    NaN       VP\n",
       "2     Li      NaN   5000  Manager\n",
       "0   Wang       VP  50000      NaN\n",
       "1  Zhang  Manager    NaN       VP\n",
       "2     Li      NaN   5000  Manager"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([data_employee_ri,data_employee_ri,data_employee_ri])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>job</th>\n",
       "      <th>sal</th>\n",
       "      <th>report</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    name      job    sal   report\n",
       "0   Wang       VP  50000      NaN\n",
       "1  Zhang  Manager    NaN       VP\n",
       "2     Li      NaN   5000  Manager\n",
       "3   Wang       VP  50000      NaN\n",
       "4  Zhang  Manager    NaN       VP\n",
       "5     Li      NaN   5000  Manager\n",
       "6   Wang       VP  50000      NaN\n",
       "7  Zhang  Manager    NaN       VP\n",
       "8     Li      NaN   5000  Manager"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([data_employee_ri,data_employee_ri,data_employee_ri],ignore_index=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1.3 纵向拼接：Merge"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据数据列关联，使用on关键字\n",
    "\n",
    "* 可以指定一列或多列\n",
    "* 可以使用left_on和right_on"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>job_x</th>\n",
       "      <th>sal_x</th>\n",
       "      <th>report_x</th>\n",
       "      <th>job_y</th>\n",
       "      <th>sal_y</th>\n",
       "      <th>report_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    name    job_x  sal_x report_x    job_y  sal_y report_y\n",
       "0   Wang       VP  50000      NaN       VP  50000      NaN\n",
       "1  Zhang  Manager    NaN       VP  Manager    NaN       VP\n",
       "2     Li      NaN   5000  Manager      NaN   5000  Manager"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(data_employee_ri,data_employee_ri,on='name')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>job</th>\n",
       "      <th>sal_x</th>\n",
       "      <th>report_x</th>\n",
       "      <th>sal_y</th>\n",
       "      <th>report_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    name      job  sal_x report_x  sal_y report_y\n",
       "0   Wang       VP  50000      NaN  50000      NaN\n",
       "1  Zhang  Manager    NaN       VP    NaN       VP\n",
       "2     Li      NaN   5000  Manager   5000  Manager"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(data_employee_ri,data_employee_ri,on=['name','job'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据index关联，可以直接使用left_index和right_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name_x</th>\n",
       "      <th>job_x</th>\n",
       "      <th>sal_x</th>\n",
       "      <th>report_x</th>\n",
       "      <th>name_y</th>\n",
       "      <th>job_y</th>\n",
       "      <th>sal_y</th>\n",
       "      <th>report_y</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>index1</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Wang</td>\n",
       "      <td>VP</td>\n",
       "      <td>50000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "      <td>Zhang</td>\n",
       "      <td>Manager</td>\n",
       "      <td>NaN</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "      <td>Li</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5000</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       name_x    job_x  sal_x report_x name_y    job_y  sal_y report_y\n",
       "index1                                                                \n",
       "0        Wang       VP  50000      NaN   Wang       VP  50000      NaN\n",
       "1       Zhang  Manager    NaN       VP  Zhang  Manager    NaN       VP\n",
       "2          Li      NaN   5000  Manager     Li      NaN   5000  Manager"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_employee_ri.index.name = 'index1'\n",
    "pd.merge(data_employee_ri,data_employee_ri,\\\n",
    "         left_index='index1',right_index='index1')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "TIPS: 增加how关键字，并指定\n",
    "* how = 'inner'\n",
    "* how = 'left'\n",
    "* how = 'right'\n",
    "* how = 'outer'\n",
    "\n",
    "结合how，可以看到merge基本再现了SQL应有的功能，并保持代码整洁。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>sal</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>老王</td>\n",
       "      <td>5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>老张</td>\n",
       "      <td>3000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>老李</td>\n",
       "      <td>1000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  name   sal\n",
       "0   老王  5000\n",
       "1   老张  3000\n",
       "2   老李  1000"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF31xA = pd.DataFrame({'name':[u'老王',u'老张',u'老李'],'sal':[5000,3000,1000]})\n",
    "DF31xA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>job</th>\n",
       "      <th>name</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>VP</td>\n",
       "      <td>老王</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Manager</td>\n",
       "      <td>老刘</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       job name\n",
       "0       VP   老王\n",
       "1  Manager   老刘"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF31xB = pd.DataFrame({'name':[u'老王',u'老刘'],'job':['VP','Manager']})\n",
    "DF31xB"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "how='left': 保留左表信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>sal</th>\n",
       "      <th>job</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>老王</td>\n",
       "      <td>5000</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>老张</td>\n",
       "      <td>3000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>老李</td>\n",
       "      <td>1000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  name   sal  job\n",
       "0   老王  5000   VP\n",
       "1   老张  3000  NaN\n",
       "2   老李  1000  NaN"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(DF31xA,DF31xB,on='name',how='left')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "how='right': 保留右表信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>sal</th>\n",
       "      <th>job</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>老王</td>\n",
       "      <td>5000</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>老刘</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  name   sal      job\n",
       "0   老王  5000       VP\n",
       "1   老刘   NaN  Manager"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(DF31xA,DF31xB,on='name',how='right')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "how='inner': 保留两表交集信息，这样尽量避免出现缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>sal</th>\n",
       "      <th>job</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>老王</td>\n",
       "      <td>5000</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  name   sal job\n",
       "0   老王  5000  VP"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(DF31xA,DF31xB,on='name',how='inner')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "how='outer': 保留两表并集信息，这样会导致缺失值，但最大程度的整合了已有信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>sal</th>\n",
       "      <th>job</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>老王</td>\n",
       "      <td>5000</td>\n",
       "      <td>VP</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>老张</td>\n",
       "      <td>3000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>老李</td>\n",
       "      <td>1000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>老刘</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Manager</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  name   sal      job\n",
       "0   老王  5000       VP\n",
       "1   老张  3000      NaN\n",
       "2   老李  1000      NaN\n",
       "3   老刘   NaN  Manager"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(DF31xA,DF31xB,on='name',how='outer')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### 3.2 数据清洗三剑客\n",
    "\n",
    "接下来的三个功能，**map**,**applymap**,**apply**,功能，是绝大多数数据分析师在数据清洗这一步骤中的必经之路。\n",
    "\n",
    "他们分别回答了以下问题：\n",
    "\n",
    "* 我想根据一列数据新做一列数据，怎么办？（Series->Series）\n",
    "* 我想根据整张表的数据新做整张表，怎么办？ （DataFrame->DataFrame）\n",
    "* 我想根据很多列的数据新做一列数据，怎么办？ （DataFrame->Series）\n",
    "\n",
    "不要再写什么for循环了！改变思维，提高编码和执行效率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP\n",
       "0    Japan    Tokyo  4000\n",
       "1  S.Korea    Seoul  1300\n",
       "2    China  Beijing  9100"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataNumPy32 = np.asarray([('Japan','Tokyo',4000),('S.Korea','Seoul',1300),('China','Beijing',9100)])\n",
    "DF32 = pd.DataFrame(dataNumPy,columns=['nation','capital','GDP'])\n",
    "DF32"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### map: 以相同规则将一列数据作一个映射，也就是进行相同函数的处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "      <th>GDP_Level</th>\n",
       "      <th>NATION</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4000</td>\n",
       "      <td>Medium</td>\n",
       "      <td>JAPAN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "      <td>Low</td>\n",
       "      <td>S.KOREA</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "      <td>High</td>\n",
       "      <td>CHINA</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP GDP_Level   NATION\n",
       "0    Japan    Tokyo  4000    Medium    JAPAN\n",
       "1  S.Korea    Seoul  1300       Low  S.KOREA\n",
       "2    China  Beijing  9100      High    CHINA"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def GDP_Factorize(v):\n",
    "    fv = np.float64(v)\n",
    "    if fv > 6000.0:\n",
    "        return 'High'\n",
    "    elif fv < 2000.0:\n",
    "        return 'Low'\n",
    "    else:\n",
    "        return 'Medium'\n",
    "\n",
    "DF32['GDP_Level'] = DF32['GDP'].map(GDP_Factorize)\n",
    "DF32['NATION'] = DF32.nation.map(str.upper)\n",
    "DF32"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 类似的功能还有applymap，可以对一个dataframe里面每一个元素像map那样全局操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "      <th>GDP_Level</th>\n",
       "      <th>NATION</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>JAPAN</td>\n",
       "      <td>TOKYO</td>\n",
       "      <td>8000</td>\n",
       "      <td>MEDIUM</td>\n",
       "      <td>JAPAN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.KOREA</td>\n",
       "      <td>SEOUL</td>\n",
       "      <td>2600</td>\n",
       "      <td>LOW</td>\n",
       "      <td>S.KOREA</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>CHINA</td>\n",
       "      <td>BEIJING</td>\n",
       "      <td>18200</td>\n",
       "      <td>HIGH</td>\n",
       "      <td>CHINA</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital    GDP GDP_Level   NATION\n",
       "0    JAPAN    TOKYO   8000    MEDIUM    JAPAN\n",
       "1  S.KOREA    SEOUL   2600       LOW  S.KOREA\n",
       "2    CHINA  BEIJING  18200      HIGH    CHINA"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF32.applymap(lambda x: float(x)*2 if x.isdigit() else x.upper())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### apply则可以对一个DataFrame操作得到一个Series\n",
    "\n",
    "他会有点像我们后面介绍的agg,但是apply可以按行操作和按列操作，用axis控制即可。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      JapanTokyo_4000\n",
       "1    S.KoreaSeoul_1300\n",
       "2    ChinaBeijing_9100\n",
       "dtype: object"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF32.apply(lambda x:x['nation']+x['capital']+'_'+x['GDP'],axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### 3.3 数据排序"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* sort: 按一列或者多列的值进行行级排序\n",
    "* sort_index: 根据index里的取值进行排序，而且可以根据axis决定是重排行还是列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP\n",
       "0    Japan    Tokyo  4000\n",
       "1  S.Korea    Seoul  1300\n",
       "2    China  Beijing  9100"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataNumPy33 = np.asarray([('Japan','Tokyo',4000),('S.Korea','Seoul',1300),('China','Beijing',9100)])\n",
    "DF33 = pd.DataFrame(dataNumPy33,columns=['nation','capital','GDP'])\n",
    "DF33"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP\n",
       "2    China  Beijing  9100\n",
       "1  S.Korea    Seoul  1300\n",
       "0    Japan    Tokyo  4000"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33.sort(['capital','nation'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP\n",
       "2    China  Beijing  9100\n",
       "0    Japan    Tokyo  4000\n",
       "1  S.Korea    Seoul  1300"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33.sort('GDP',ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP\n",
       "2    China  Beijing  9100\n",
       "1  S.Korea    Seoul  1300\n",
       "0    Japan    Tokyo  4000"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33.sort('GDP').sort(ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>GDP</th>\n",
       "      <th>capital</th>\n",
       "      <th>nation</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4000</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>Japan</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1300</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>S.Korea</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>9100</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>China</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    GDP  capital   nation\n",
       "0  4000    Tokyo    Japan\n",
       "1  1300    Seoul  S.Korea\n",
       "2  9100  Beijing    China"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33.sort_index(axis=1,ascending=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一个好用的功能：Rank"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Japan</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>4000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S.Korea</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>China</td>\n",
       "      <td>Beijing</td>\n",
       "      <td>9100</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    nation  capital   GDP\n",
       "0    Japan    Tokyo  4000\n",
       "1  S.Korea    Seoul  1300\n",
       "2    China  Beijing  9100"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   nation  capital  GDP\n",
       "0       2        3    2\n",
       "1       3        2    1\n",
       "2       1        1    3"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33.rank()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nation</th>\n",
       "      <th>capital</th>\n",
       "      <th>GDP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   nation  capital  GDP\n",
       "0       2        1    2\n",
       "1       1        2    3\n",
       "2       3        3    1"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33.rank(ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注意tied data（相同值）的处理：\n",
    "* method = 'average'\n",
    "* method = 'min'\n",
    "* method = 'max'\n",
    "* method = 'first'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>sal</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>老王</td>\n",
       "      <td>5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>老张</td>\n",
       "      <td>3000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>老李</td>\n",
       "      <td>5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>老刘</td>\n",
       "      <td>9000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  name   sal\n",
       "0   老王  5000\n",
       "1   老张  3000\n",
       "2   老李  5000\n",
       "3   老刘  9000"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33x = pd.DataFrame({'name':[u'老王',u'老张',u'老李',u'老刘'],'sal':np.array([5000,3000,5000,9000])})\n",
    "DF33x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "DF33x.rank()默认使用method='average'，两条数据相等时，处理排名时大家都用平均值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    2.5\n",
       "1    1.0\n",
       "2    2.5\n",
       "3    4.0\n",
       "Name: sal, dtype: float64"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33x.sal.rank()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "method='min'，处理排名时大家都用最小值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    2\n",
       "1    1\n",
       "2    2\n",
       "3    4\n",
       "Name: sal, dtype: float64"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33x.sal.rank(method='min')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "method='max'，处理排名时大家都用最大值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    3\n",
       "1    1\n",
       "2    3\n",
       "3    4\n",
       "Name: sal, dtype: float64"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33x.sal.rank(method='max')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "method='first'，处理排名时谁先出现就先给谁较小的数值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    2\n",
       "1    1\n",
       "2    3\n",
       "3    4\n",
       "Name: sal, dtype: float64"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF33x.sal.rank(method='first')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### 3.4 缺失数据处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Col_1</th>\n",
       "      <th>Col_2</th>\n",
       "      <th>Col_3</th>\n",
       "      <th>Col_4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Row_1</th>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_2</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_3</th>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_4</th>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Col_1  Col_2  Col_3  Col_4\n",
       "Row_1      0    NaN    NaN    NaN\n",
       "Row_2      1      2    NaN    NaN\n",
       "Row_3      3      4      5    NaN\n",
       "Row_4      6      7      8      9"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF34 = data_for_multi2.unstack()\n",
    "DF34"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "忽略缺失值："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Col_1    2.500000\n",
       "Col_2    4.333333\n",
       "Col_3    6.500000\n",
       "Col_4    9.000000\n",
       "dtype: float64"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF34.mean(skipna=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Col_1    2.5\n",
       "Col_2    NaN\n",
       "Col_3    NaN\n",
       "Col_4    NaN\n",
       "dtype: float64"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF34.mean(skipna=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果不想忽略缺失值的话，就需要祭出fillna了："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Col_1</th>\n",
       "      <th>Col_2</th>\n",
       "      <th>Col_3</th>\n",
       "      <th>Col_4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Row_1</th>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_2</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_3</th>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Row_4</th>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Col_1  Col_2  Col_3  Col_4\n",
       "Row_1      0    NaN    NaN    NaN\n",
       "Row_2      1      2    NaN    NaN\n",
       "Row_3      3      4      5    NaN\n",
       "Row_4      6      7      8      9"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF34"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Row_1    0.00\n",
       "Row_2    0.75\n",
       "Row_3    3.00\n",
       "Row_4    7.50\n",
       "dtype: float64"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF34.fillna(0).mean(axis=1,skipna=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. “一组”大熊猫：Pandas的groupby"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "groupby的功能类似SQL的group by关键字：\n",
    "\n",
    "Split-Apply-Combine\n",
    "\n",
    "* Split，就是按照规则分组\n",
    "* Apply，通过一定的agg函数来获得输入pd.Series返回一个值的效果\n",
    "* Combine，把结果收集起来\n",
    "\n",
    "Pandas的groupby的灵活性：\n",
    "\n",
    "* 分组的关键字可以来自于index，也可以来自于真实的列数据\n",
    "* 分组规则可以通过一列或者多列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n09YISwQlgjpENQI70lwOC4k6hifaBbQJaUZV6TQmfMBI+Az7HnMdN2gtAiIgAiUnIHFd8g6g6ouA\nCIwlgGhsJ84akc02QtsENUI6lrhjrovrENbZNdu1DxiNjYvuAKK1CIiACIiARgtRHxABERABCCAa\nQyzXBGRVZBOHHefKRouwlwgTCZEdvNiPc3GsbHxUXxEQARGoJyDPdT0R7YuACJSWwBiBbRR87Oaq\nx7q0UOorjkffmGSFNpfU79ffpn0REAERKAsBieuytLTqKQIi0BCBM0Qi3lkEpaWyeq8DXHAwIHFI\naxEQAREQgToCEtd1QLQrAiIgAuMRqInL8S7QcREQAREQgdIT0Hy1pe8CAiACIiACIiACIiACIpAX\nAYnrvEgqHxEQAREQAREQAREQgdITkLgufRcQABEQAREQAREQAREQgbwISFznRVL5iIAIiIAIiIAI\niIAIlJ6AxHXpu4AAiIAIiIAIiIAIiIAI5EVA4jovkspHBERABERABERABESg9AQkrkvfBQRABERA\nBERABERABEQgLwIS13mRVD4iIAIiIAIiIAIiIAKlJyBxXfouIAAiIAIiIAIiIAIiIAJ5EZC4zouk\n8hEBERABERABERABESg9AYnr0ncBARABERABERABERABEciLgMR1XiSVjwiIgAiIgAiIgAiIQOkJ\nSFyXvgsIgAiIgAiIgAiIgAiIQF4EJK7zIql8REAEREAEREAEREAESk9A4rr0XUAAREAEREAEREAE\nREAE8iIgcZ0XSeUjAiIgAiIgAiIgAiJQegIS16XvAgIgAiIgAiIgAiIgAiKQF4HORjKqVCrpmWee\nSUNDQ41crmtEQAREQAREQAREQAREYNYT6OvrS+3t7amtra3hurSdsnSuqwcHB/2SBi49V1Y6LwIi\nIAIiIAIiIAIiIAKzgkCI6v7+fhfZjRjdkLhuJCNdIwIiIAIiIAIiIAIiIAJlJ6CY67L3ANVfBERA\nBERABERABEQgNwIS17mhVEYiIAIiIAIiIAIiIAJlJyBxXfYeoPqLgAiIgAiIgAiIgAjkRkDiOjeU\nykgEREAEREAEREAERKDsBCSuy94DVH8REAEREAEREAEREIHcCPw/LLGYWfKk4x4AAAAASUVORK5C\nYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import Image\n",
    "Image(filename=\"S1EP3_group.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "分组的具体逻辑"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pandas.core.groupby.DataFrameGroupBy object at 0x10a543b10>"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "irisdata_group = irisdata.groupby('class')\n",
    "irisdata_group"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iris-setosa\n",
      "    sepal_length  sepal_width  petal_length  petal_width        class\n",
      "0            5.1          3.5           1.4          0.2  Iris-setosa\n",
      "20           5.4          3.4           1.7          0.2  Iris-setosa\n",
      "40           5.0          3.5           1.3          0.3  Iris-setosa\n",
      "Iris-versicolor\n",
      "    sepal_length  sepal_width  petal_length  petal_width            class\n",
      "50           7.0          3.2           4.7          1.4  Iris-versicolor\n",
      "70           5.9          3.2           4.8          1.8  Iris-versicolor\n",
      "90           5.5          2.6           4.4          1.2  Iris-versicolor\n",
      "Iris-virginica\n",
      "     sepal_length  sepal_width  petal_length  petal_width           class\n",
      "100           6.3          3.3           6.0          2.5  Iris-virginica\n",
      "120           6.9          3.2           5.7          2.3  Iris-virginica\n",
      "140           6.7          3.1           5.6          2.4  Iris-virginica\n"
     ]
    }
   ],
   "source": [
    "for level,subsetDF in irisdata_group:\n",
    "    print level\n",
    "    print subsetDF[::20]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "分组可以快速实现MapReduce的逻辑\n",
    "\n",
    "* Map: 指定分组的列标签，不同的值就会被扔到不同的分组处理\n",
    "* Reduce: 输入多个值，返回一个值，一般可以通过agg实现，agg能接受一个函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>class</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Iris-setosa</th>\n",
       "      <td>0.116502</td>\n",
       "      <td>0.103857</td>\n",
       "      <td>0.069702</td>\n",
       "      <td>1.161506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Iris-versicolor</th>\n",
       "      <td>0.102232</td>\n",
       "      <td>-0.352014</td>\n",
       "      <td>-0.588404</td>\n",
       "      <td>-0.030249</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Iris-virginica</th>\n",
       "      <td>0.114492</td>\n",
       "      <td>0.355026</td>\n",
       "      <td>0.533044</td>\n",
       "      <td>-0.125612</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 sepal_length  sepal_width  petal_length  petal_width\n",
       "class                                                                \n",
       "Iris-setosa          0.116502     0.103857      0.069702     1.161506\n",
       "Iris-versicolor      0.102232    -0.352014     -0.588404    -0.030249\n",
       "Iris-virginica       0.114492     0.355026      0.533044    -0.125612"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "irisdata.groupby('class').agg(\\\n",
    "    lambda x:((x-x.mean())**3).sum()*(len(x)-0.0)/\\\n",
    "                (len(x)-1.0)/(len(x)-2.0)/(x.std()*np.sqrt((len(x)-0.0)/(len(x)-1.0)))**3 if len(x)>2 else None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>class</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Iris-setosa</th>\n",
       "      <td>0.116454</td>\n",
       "      <td>0.103814</td>\n",
       "      <td>0.069673</td>\n",
       "      <td>1.161022</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Iris-versicolor</th>\n",
       "      <td>0.102190</td>\n",
       "      <td>-0.351867</td>\n",
       "      <td>-0.588159</td>\n",
       "      <td>-0.030236</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Iris-virginica</th>\n",
       "      <td>0.114445</td>\n",
       "      <td>0.354878</td>\n",
       "      <td>0.532822</td>\n",
       "      <td>-0.125560</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 sepal_length  sepal_width  petal_length  petal_width\n",
       "class                                                                \n",
       "Iris-setosa          0.116454     0.103814      0.069673     1.161022\n",
       "Iris-versicolor      0.102190    -0.351867     -0.588159    -0.030236\n",
       "Iris-virginica       0.114445     0.354878      0.532822    -0.125560"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "irisdata.groupby('class').agg(spstat.skew)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 汇总之后的广播操作\n",
    "\n",
    "在OLAP数据库上，为了避免groupby+join的二次操作，提出了sum()over(partition by)的开窗操作。\n",
    "\n",
    "在Pandas中，这种操作能够进一步被transform所取代。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "      <th>class</th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "      <td>5.006</td>\n",
       "      <td>3.418</td>\n",
       "      <td>1.464</td>\n",
       "      <td>0.244</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "      <td>5.006</td>\n",
       "      <td>3.418</td>\n",
       "      <td>1.464</td>\n",
       "      <td>0.244</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.3</td>\n",
       "      <td>Iris-setosa</td>\n",
       "      <td>5.006</td>\n",
       "      <td>3.418</td>\n",
       "      <td>1.464</td>\n",
       "      <td>0.244</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>5.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Iris-versicolor</td>\n",
       "      <td>5.936</td>\n",
       "      <td>2.770</td>\n",
       "      <td>4.260</td>\n",
       "      <td>1.326</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80</th>\n",
       "      <td>5.5</td>\n",
       "      <td>2.4</td>\n",
       "      <td>3.8</td>\n",
       "      <td>1.1</td>\n",
       "      <td>Iris-versicolor</td>\n",
       "      <td>5.936</td>\n",
       "      <td>2.770</td>\n",
       "      <td>4.260</td>\n",
       "      <td>1.326</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100</th>\n",
       "      <td>6.3</td>\n",
       "      <td>3.3</td>\n",
       "      <td>6.0</td>\n",
       "      <td>2.5</td>\n",
       "      <td>Iris-virginica</td>\n",
       "      <td>6.588</td>\n",
       "      <td>2.974</td>\n",
       "      <td>5.552</td>\n",
       "      <td>2.026</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>120</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.2</td>\n",
       "      <td>5.7</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "      <td>6.588</td>\n",
       "      <td>2.974</td>\n",
       "      <td>5.552</td>\n",
       "      <td>2.026</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>140</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.1</td>\n",
       "      <td>5.6</td>\n",
       "      <td>2.4</td>\n",
       "      <td>Iris-virginica</td>\n",
       "      <td>6.588</td>\n",
       "      <td>2.974</td>\n",
       "      <td>5.552</td>\n",
       "      <td>2.026</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal_length  sepal_width  petal_length  petal_width            class  \\\n",
       "0             5.1          3.5           1.4          0.2      Iris-setosa   \n",
       "20            5.4          3.4           1.7          0.2      Iris-setosa   \n",
       "40            5.0          3.5           1.3          0.3      Iris-setosa   \n",
       "60            5.0          2.0           3.5          1.0  Iris-versicolor   \n",
       "80            5.5          2.4           3.8          1.1  Iris-versicolor   \n",
       "100           6.3          3.3           6.0          2.5   Iris-virginica   \n",
       "120           6.9          3.2           5.7          2.3   Iris-virginica   \n",
       "140           6.7          3.1           5.6          2.4   Iris-virginica   \n",
       "\n",
       "     sepal_length  sepal_width  petal_length  petal_width  \n",
       "0           5.006        3.418         1.464        0.244  \n",
       "20          5.006        3.418         1.464        0.244  \n",
       "40          5.006        3.418         1.464        0.244  \n",
       "60          5.936        2.770         4.260        1.326  \n",
       "80          5.936        2.770         4.260        1.326  \n",
       "100         6.588        2.974         5.552        2.026  \n",
       "120         6.588        2.974         5.552        2.026  \n",
       "140         6.588        2.974         5.552        2.026  "
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([irisdata,irisdata.groupby('class').transform('mean')],axis=1)[::20]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 产生 MultiIndex（多列分组）后的数据透视表操作\n",
    "\n",
    "一般来说，多列groupby的一个副作用就是.groupby().agg()之后你的行index已经变成了一个多列分组的分级索引。\n",
    "\n",
    "如果我们希望达到Excel的数据透视表的效果，行和列的索引自由交换，达到统计目的，究竟应该怎么办呢？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "factor1 = np.random.randint(0,3,50)\n",
    "factor2 = np.random.randint(0,2,50)\n",
    "factor3 = np.random.randint(0,3,50)\n",
    "values = np.random.randn(50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>F1</th>\n",
       "      <th>F2</th>\n",
       "      <th>F3</th>\n",
       "      <th>F4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.083928</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.949984</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.037692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.518305</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.963678</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.284463</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.412449</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.277126</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>-2.488946</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0.167413</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.520003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.665450</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.783906</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.077717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>-2.018863</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.993884</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>-1.051174</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.723457</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.783521</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.355093</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.252415</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.600679</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.660498</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.301613</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>-1.270339</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.074086</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.043586</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>-2.000161</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>-1.041330</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.984101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.160715</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.903035</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>-1.105763</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.850310</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.062946</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.507763</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.112303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.663782</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.147671</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>-1.552327</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>-1.166517</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.622502</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1.620961</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.354238</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.233783</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.131051</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>-1.301164</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>-1.013341</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.508761</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>-1.104457</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    F1  F2  F3        F4\n",
       "0    1   0   1 -0.083928\n",
       "1    0   0   0  0.949984\n",
       "2    2   1   0 -0.037692\n",
       "3    0   1   1 -0.518305\n",
       "4    1   0   0  0.963678\n",
       "5    1   1   1 -0.284463\n",
       "6    0   0   1  0.412449\n",
       "7    2   0   0 -0.277126\n",
       "8    0   0   2 -2.488946\n",
       "9    0   1   0  0.167413\n",
       "10   0   1   1  1.520003\n",
       "11   0   1   2 -0.665450\n",
       "12   1   1   2  0.783906\n",
       "13   1   1   1 -0.077717\n",
       "14   2   0   2 -2.018863\n",
       "15   0   1   1 -0.993884\n",
       "16   2   0   2 -1.051174\n",
       "17   0   0   2 -0.723457\n",
       "18   1   1   0 -0.783521\n",
       "19   1   0   2  0.355093\n",
       "20   1   0   0 -0.252415\n",
       "21   0   0   2  0.600679\n",
       "22   2   1   2 -0.660498\n",
       "23   0   0   2 -0.301613\n",
       "24   0   1   2 -1.270339\n",
       "25   0   0   0  0.074086\n",
       "26   1   0   0 -0.043586\n",
       "27   0   1   2 -2.000161\n",
       "28   2   1   1 -1.041330\n",
       "29   2   1   1  0.984101\n",
       "30   2   0   0  0.160715\n",
       "31   1   1   2  0.903035\n",
       "32   1   1   1 -1.105763\n",
       "33   1   0   0  0.850310\n",
       "34   1   1   0 -0.062946\n",
       "35   1   1   0 -0.507763\n",
       "36   1   0   1  0.112303\n",
       "37   2   1   2 -0.663782\n",
       "38   2   1   1  1.147671\n",
       "39   0   0   2 -1.552327\n",
       "40   1   1   1 -1.166517\n",
       "41   0   1   0 -0.622502\n",
       "42   0   1   2  1.620961\n",
       "43   1   1   0 -0.354238\n",
       "44   1   0   2 -0.233783\n",
       "45   0   0   0  0.131051\n",
       "46   2   1   1 -1.301164\n",
       "47   1   0   2 -1.013341\n",
       "48   2   0   1 -0.508761\n",
       "49   0   0   1 -1.104457"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hierindexDF = pd.DataFrame({'F1':factor1,'F2':factor2,'F3':factor3,'F4':values})\n",
    "hierindexDF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>F4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>F1</th>\n",
       "      <th>F2</th>\n",
       "      <th>F3</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"6\" valign=\"top\">0</th>\n",
       "      <th rowspan=\"3\" valign=\"top\">0</th>\n",
       "      <th>0</th>\n",
       "      <td>1.155121</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.692009</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-4.465664</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1</th>\n",
       "      <th>0</th>\n",
       "      <td>-0.455089</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.007813</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2.314989</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"6\" valign=\"top\">1</th>\n",
       "      <th rowspan=\"3\" valign=\"top\">0</th>\n",
       "      <th>0</th>\n",
       "      <td>1.517987</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.028374</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.892030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1</th>\n",
       "      <th>0</th>\n",
       "      <td>-1.708468</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-2.634460</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.686941</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"6\" valign=\"top\">2</th>\n",
       "      <th rowspan=\"3\" valign=\"top\">0</th>\n",
       "      <th>0</th>\n",
       "      <td>-0.116412</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.508761</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-3.070037</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1</th>\n",
       "      <th>0</th>\n",
       "      <td>-0.037692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.210722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.324281</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                F4\n",
       "F1 F2 F3          \n",
       "0  0  0   1.155121\n",
       "      1  -0.692009\n",
       "      2  -4.465664\n",
       "   1  0  -0.455089\n",
       "      1   0.007813\n",
       "      2  -2.314989\n",
       "1  0  0   1.517987\n",
       "      1   0.028374\n",
       "      2  -0.892030\n",
       "   1  0  -1.708468\n",
       "      1  -2.634460\n",
       "      2   1.686941\n",
       "2  0  0  -0.116412\n",
       "      1  -0.508761\n",
       "      2  -3.070037\n",
       "   1  0  -0.037692\n",
       "      1  -0.210722\n",
       "      2  -1.324281"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hierindexDF_gbsum = hierindexDF.groupby(['F1','F2','F3']).sum()\n",
    "hierindexDF_gbsum"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "观察Index："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MultiIndex(levels=[[0, 1, 2], [0, 1], [0, 1, 2]],\n",
       "           labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2], [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]],\n",
       "           names=[u'F1', u'F2', u'F3'])"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hierindexDF_gbsum.index"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "unstack：\n",
    "\n",
    "* 无参数时，把最末index置换到column上\n",
    "* 有数字参数时，把指定位置的index置换到column上\n",
    "* 有列表参数时，依次把特定位置的index置换到column上"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th colspan=\"3\" halign=\"left\">F4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>F3</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>F1</th>\n",
       "      <th>F2</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">0</th>\n",
       "      <th>0</th>\n",
       "      <td>1.155121</td>\n",
       "      <td>-0.692009</td>\n",
       "      <td>-4.465664</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.455089</td>\n",
       "      <td>0.007813</td>\n",
       "      <td>-2.314989</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">1</th>\n",
       "      <th>0</th>\n",
       "      <td>1.517987</td>\n",
       "      <td>0.028374</td>\n",
       "      <td>-0.892030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.708468</td>\n",
       "      <td>-2.634460</td>\n",
       "      <td>1.686941</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">2</th>\n",
       "      <th>0</th>\n",
       "      <td>-0.116412</td>\n",
       "      <td>-0.508761</td>\n",
       "      <td>-3.070037</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.037692</td>\n",
       "      <td>-0.210722</td>\n",
       "      <td>-1.324281</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             F4                    \n",
       "F3            0         1         2\n",
       "F1 F2                              \n",
       "0  0   1.155121 -0.692009 -4.465664\n",
       "   1  -0.455089  0.007813 -2.314989\n",
       "1  0   1.517987  0.028374 -0.892030\n",
       "   1  -1.708468 -2.634460  1.686941\n",
       "2  0  -0.116412 -0.508761 -3.070037\n",
       "   1  -0.037692 -0.210722 -1.324281"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hierindexDF_gbsum.unstack()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th colspan=\"3\" halign=\"left\">F4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>F1</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>F2</th>\n",
       "      <th>F3</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">0</th>\n",
       "      <th>0</th>\n",
       "      <td>1.155121</td>\n",
       "      <td>1.517987</td>\n",
       "      <td>-0.116412</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.692009</td>\n",
       "      <td>0.028374</td>\n",
       "      <td>-0.508761</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-4.465664</td>\n",
       "      <td>-0.892030</td>\n",
       "      <td>-3.070037</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1</th>\n",
       "      <th>0</th>\n",
       "      <td>-0.455089</td>\n",
       "      <td>-1.708468</td>\n",
       "      <td>-0.037692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.007813</td>\n",
       "      <td>-2.634460</td>\n",
       "      <td>-0.210722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2.314989</td>\n",
       "      <td>1.686941</td>\n",
       "      <td>-1.324281</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             F4                    \n",
       "F1            0         1         2\n",
       "F2 F3                              \n",
       "0  0   1.155121  1.517987 -0.116412\n",
       "   1  -0.692009  0.028374 -0.508761\n",
       "   2  -4.465664 -0.892030 -3.070037\n",
       "1  0  -0.455089 -1.708468 -0.037692\n",
       "   1   0.007813 -2.634460 -0.210722\n",
       "   2  -2.314989  1.686941 -1.324281"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hierindexDF_gbsum.unstack(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">F4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>F2</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>F1</th>\n",
       "      <th>F3</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">0</th>\n",
       "      <th>0</th>\n",
       "      <td>1.155121</td>\n",
       "      <td>-0.455089</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.692009</td>\n",
       "      <td>0.007813</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-4.465664</td>\n",
       "      <td>-2.314989</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1</th>\n",
       "      <th>0</th>\n",
       "      <td>1.517987</td>\n",
       "      <td>-1.708468</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.028374</td>\n",
       "      <td>-2.634460</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.892030</td>\n",
       "      <td>1.686941</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2</th>\n",
       "      <th>0</th>\n",
       "      <td>-0.116412</td>\n",
       "      <td>-0.037692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.508761</td>\n",
       "      <td>-0.210722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-3.070037</td>\n",
       "      <td>-1.324281</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             F4          \n",
       "F2            0         1\n",
       "F1 F3                    \n",
       "0  0   1.155121 -0.455089\n",
       "   1  -0.692009  0.007813\n",
       "   2  -4.465664 -2.314989\n",
       "1  0   1.517987 -1.708468\n",
       "   1   0.028374 -2.634460\n",
       "   2  -0.892030  1.686941\n",
       "2  0  -0.116412 -0.037692\n",
       "   1  -0.508761 -0.210722\n",
       "   2  -3.070037 -1.324281"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hierindexDF_gbsum.unstack(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"9\" halign=\"left\">F4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>F3</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>F1</th>\n",
       "      <th>0</th>\n",
       "      <th>0</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>1</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>2</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>F2</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.155121</td>\n",
       "      <td>-0.692009</td>\n",
       "      <td>-4.465664</td>\n",
       "      <td>1.517987</td>\n",
       "      <td>0.028374</td>\n",
       "      <td>-0.892030</td>\n",
       "      <td>-0.116412</td>\n",
       "      <td>-0.508761</td>\n",
       "      <td>-3.070037</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.455089</td>\n",
       "      <td>0.007813</td>\n",
       "      <td>-2.314989</td>\n",
       "      <td>-1.708468</td>\n",
       "      <td>-2.634460</td>\n",
       "      <td>1.686941</td>\n",
       "      <td>-0.037692</td>\n",
       "      <td>-0.210722</td>\n",
       "      <td>-1.324281</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          F4                                                              \\\n",
       "F3         0         1         2         0         1         2         0   \n",
       "F1         0         0         0         1         1         1         2   \n",
       "F2                                                                         \n",
       "0   1.155121 -0.692009 -4.465664  1.517987  0.028374 -0.892030 -0.116412   \n",
       "1  -0.455089  0.007813 -2.314989 -1.708468 -2.634460  1.686941 -0.037692   \n",
       "\n",
       "                        \n",
       "F3         1         2  \n",
       "F1         2         2  \n",
       "F2                      \n",
       "0  -0.508761 -3.070037  \n",
       "1  -0.210722 -1.324281  "
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hierindexDF_gbsum.unstack([2,0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "更进一步的，stack的功能是和unstack对应，把column上的多级索引换到index上去"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>F4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>F2</th>\n",
       "      <th>F3</th>\n",
       "      <th>F1</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"9\" valign=\"top\">0</th>\n",
       "      <th rowspan=\"3\" valign=\"top\">0</th>\n",
       "      <th>0</th>\n",
       "      <td>1.155121</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.517987</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.116412</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1</th>\n",
       "      <th>0</th>\n",
       "      <td>-0.692009</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.028374</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.508761</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2</th>\n",
       "      <th>0</th>\n",
       "      <td>-4.465664</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.892030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-3.070037</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"9\" valign=\"top\">1</th>\n",
       "      <th rowspan=\"3\" valign=\"top\">0</th>\n",
       "      <th>0</th>\n",
       "      <td>-0.455089</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.708468</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.037692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">1</th>\n",
       "      <th>0</th>\n",
       "      <td>0.007813</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-2.634460</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.210722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">2</th>\n",
       "      <th>0</th>\n",
       "      <td>-2.314989</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.686941</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.324281</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                F4\n",
       "F2 F3 F1          \n",
       "0  0  0   1.155121\n",
       "      1   1.517987\n",
       "      2  -0.116412\n",
       "   1  0  -0.692009\n",
       "      1   0.028374\n",
       "      2  -0.508761\n",
       "   2  0  -4.465664\n",
       "      1  -0.892030\n",
       "      2  -3.070037\n",
       "1  0  0  -0.455089\n",
       "      1  -1.708468\n",
       "      2  -0.037692\n",
       "   1  0   0.007813\n",
       "      1  -2.634460\n",
       "      2  -0.210722\n",
       "   2  0  -2.314989\n",
       "      1   1.686941\n",
       "      2  -1.324281"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hierindexDF_gbsum.unstack([2,0]).stack([1,2])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
